package com.jzo2o.foundations.task;

import com.jzo2o.api.foundations.dto.response.RegionSimpleResDTO;
import com.jzo2o.foundations.constants.RedisConstants;
import com.jzo2o.foundations.mapper.RegionMapper;
import com.jzo2o.foundations.service.IRegionServeService;
import com.jzo2o.foundations.service.IRegionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 定时任务类，用于刷新各种缓存数据
 */
@Component
@Slf4j
public class WxServeTask {

    @Resource
    private IRegionService regionService;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Resource
    private IRegionServeService regionServeService;
    @Resource
    private RegionMapper regionMapper;

    /**
     * 统一定时任务方法，每天凌晨1点执行
     * 执行所有缓存刷新任务：
     * 1. 开通服务区域缓存刷新
     * 2. 微信小程序端首页服务列表缓存刷新
     * 3. 微信小程序端服务类型列表缓存刷新
     * 4. 小程序端首页热门服务列表缓存刷新
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void executeAllTasks() {
        try {
            log.info("开始执行统一定时任务{}", LocalDateTime.now());

            // 1. 执行开通服务区域定时任务
            redisTemplate.delete(RedisConstants.CacheName.JZ_CACHE + "::ACTIVE_REGIONS");
            regionService.queryActiveRegionListCache();

            // 2. 获取活跃区域ID列表
            List<RegionSimpleResDTO> regionSimpleResDTOS = regionService.queryActiveRegionListCache();
            if (CollectionUtils.isEmpty(regionSimpleResDTOS)) {
                log.info("无活跃区域，跳过后续任务");
                return;
            }
            List<Long> regionIds = regionSimpleResDTOS.stream()
                    .map(RegionSimpleResDTO::getId)
                    .collect(Collectors.toList());

            // 3. 执行微信小程序端首页服务列表定时任务
            deleteCacheByPrefix(RedisConstants.CacheName.SERVE_ICON);
            regionIds.forEach(regionId -> regionServeService.queryCategoryList(regionId));

            // 4. 执行微信小程序端服务类型列表缓存定时任务
            deleteCacheByPrefix(RedisConstants.CacheName.SERVE_TYPE);
            regionIds.forEach(regionId -> regionMapper.selectAllTypeByRegionId(regionId));

            // 5. 执行小程序端首页热门服务列表定时任务
            deleteCacheByPrefix(RedisConstants.CacheName.HOT_SERVE);
            regionIds.forEach(regionId -> regionMapper.selectHotServeList(regionId));

            log.info("统一定时任务执行完毕");
        } catch (Exception e) {
            log.error("统一定时任务执行异常:", e);
        }
    }

    /**
     * 根据前缀删除缓存
     *
     * @param cachePrefix 缓存前缀
     */
    private void deleteCacheByPrefix(String cachePrefix) {
        Set<String> keys = redisTemplate.keys(cachePrefix + "*");
        if (keys != null && !keys.isEmpty()) {
            redisTemplate.delete(keys);
        }
    }
}

//package com.jzo2o.foundations.task;
//
//import com.jzo2o.api.foundations.dto.response.RegionSimpleResDTO;
//import com.jzo2o.foundations.constants.RedisConstants;
//import com.jzo2o.foundations.mapper.RegionMapper;
//import com.jzo2o.foundations.service.IRegionServeService;
//import com.jzo2o.foundations.service.IRegionService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.util.CollectionUtils;
//
//import javax.annotation.Resource;
//import java.time.LocalDateTime;
//import java.util.List;
//import java.util.Set;
//import java.util.stream.Collectors;
//
///**
// * \* User: chy
// * \* Date: 2025/9/27  19:07
// * \* Description:
// * \
// */
//@Component
//@Slf4j
//public class WxServeTask {
//
//    @Resource
//    private IRegionService regionService;
//    @Resource
//    private RedisTemplate<String, Object> redisTemplate;
//    @Resource
//    private IRegionServeService regionServeService;
//    @Resource
//    private RegionMapper regionMapper;
//
//    /**
//     * 开通服务区域定时任务   每天凌晨1点执行
//     */
//    @Scheduled(cron = "0 0 1 * * ?")//每天凌晨1点执行
////    @Scheduled(cron = "0/5 * * * * ?")//测试用
//    public void activeRegion() {
//        try {
//            log.info("开始执行开通服务区域定时任务{}", LocalDateTime.now());
//            //删除缓存
//            redisTemplate.delete(RedisConstants.CacheName.JZ_CACHE + "::ACTIVE_REGIONS");
//            //调用方法触发缓存刷新
//            regionService.queryActiveRegionListCache();
//
//            log.info("开通服务区域定时任务执行完毕");
//        } catch (Exception e) {
//            log.error("开通服务区域定时任务执行异常e:", e);
//        }
//    }
//
//    /**
//     * 微信小程序端首页服务列表定时任务
//     */
//    @Scheduled(cron = "0 0 1 * * ?")
//    public void queryServeList() {
//        try {
//            log.info("开始执行微信小程序端首页服务列表定时任务{}", LocalDateTime.now());
//            //拿到所有开通服务区域ids
//            List<RegionSimpleResDTO> regionSimpleResDTOS = regionService.queryActiveRegionListCache();
//            if (CollectionUtils.isEmpty(regionSimpleResDTOS)) {
//                return;
//            }
//            List<Long> regionIds = regionSimpleResDTOS.stream().map(RegionSimpleResDTO::getId).collect(Collectors.toList());
//
//            // 删除所有以特定前缀开头的key
//            Set<String> keys = redisTemplate.keys(RedisConstants.CacheName.SERVE_ICON + "*");
//            if (keys != null && !keys.isEmpty()) {
//                redisTemplate.delete(keys);
//            }
//            //循环查询,重新生成缓存逻辑
//            regionIds.forEach(regionId -> {
//                regionServeService.queryCategoryList(regionId);
//            });
//
//            log.info("微信小程序端首页服务列表定时任务执行完毕");
//        } catch (Exception e) {
//            log.error("微信小程序端首页服务列表定时任务执行异常e:", e);
//        }
//    }
//
//    /**
//     * 微信小程序端服务类型列表缓存定时任务
//     */
//    @Scheduled(cron = "0 0 1 * * ?")
//    public void serveTypeListTask() {
//        try {
//            log.info("开始执行微信小程序端服务类型列表缓存定时任务{}", LocalDateTime.now());
//            //拿到所有开通服务区域ids
//            List<RegionSimpleResDTO> regionSimpleResDTOS = regionService.queryActiveRegionListCache();
//            if (CollectionUtils.isEmpty(regionSimpleResDTOS)) {
//                return;
//            }
//            List<Long> regionIds = regionSimpleResDTOS.stream().map(RegionSimpleResDTO::getId).collect(Collectors.toList());
//            //删除所有以特定前缀开头的key
//            Set<String> keys = redisTemplate.keys(RedisConstants.CacheName.SERVE_TYPE + "*");
//            if (keys != null && !keys.isEmpty()) {
//                redisTemplate.delete(keys);
//            }
//            //循环查询,重新生成缓存逻辑
//            regionIds.forEach(regionId -> {
//                regionMapper.selectAllTypeByRegionId(regionId);
//            });
//            log.info("微信小程序端服务类型列表缓存定时任务执行完毕");
//        } catch (Exception e) {
//            log.error("微信小程序端服务类型列表缓存定时任务执行异常e:", e);
//        }
//    }
//    /**
//     * 小程序端首页热门服务列表定时任务
//     */
//    @Scheduled(cron = "0 0 1 * * ?")
//    public void HotServeListTask(){
//        try {
//            log.info("开始执行小程序端首页热门服务列表定时任务{}", LocalDateTime.now());
//            //拿到所有开通服务区域ids
//            List<RegionSimpleResDTO> regionSimpleResDTOS = regionService.queryActiveRegionListCache();
//            if (CollectionUtils.isEmpty(regionSimpleResDTOS)) {
//                return;
//            }
//            List<Long> regionIds = regionSimpleResDTOS.stream().map(RegionSimpleResDTO::getId).collect(Collectors.toList());
//            //删除所有以特定前缀开头的key
//            Set<String> keys = redisTemplate.keys(RedisConstants.CacheName.HOT_SERVE + "*");
//            if (keys != null && !keys.isEmpty()) {
//                redisTemplate.delete(keys);
//            }
//            regionIds.forEach(regionId -> {
//                regionMapper.selectHotServeList(regionId);
//            });
//            log.info("小程序端首页热门服务列表定时任务执行完毕");
//        } catch (Exception e) {
//            log.error("小程序端首页热门服务列表定时任务执行异常e:", e);
//        }
//    }
//}
